<?php
/**
 * vanephp web framework
 * 框架核心类
 *
 * @author aray <ofree@qq.com>
 * @link http://www.vanephp.com/
 * @copyright Copyright &copy; 2010 aray
 * @license http://www.vanephp.com/license
 * @package core
 */

define ( 'INVANE', true );
define ( 'APP_NAME', 'vanephp' );
define ( 'APP_VERSION', '1.8' );
define ( 'APP_COPYRIGHT', 'http://www.vanephp.com/' );
define ( 'DS', DIRECTORY_SEPARATOR );
define ( 'VANEDIR', realpath ( dirname ( __FILE__ ) ) );
define ( 'URI', $_SERVER['REQUEST_URI'] );
define ( 'APP_LOGO', '/9j/4AAQSkZJRgABAgEASABIAAD/4QiFRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEaAAUAAAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAcAAAAcgEyAAIAAAAUAAAAjodpAAQAAAABAAAApAAAANAACvyAAAAnEAAK/IAAACcQQWRvYmUgUGhvdG9zaG9wIENTMyBXaW5kb3dzADIwMTA6MDc6MjIgMjM6NTU6MzYAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAeKADAAQAAAABAAAAHgAAAAAAAAAGAQMAAwAAAAEABgAAARoABQAAAAEAAAEeARsABQAAAAEAAAEmASgAAwAAAAEAAgAAAgEABAAAAAEAAAEuAgIABAAAAAEAAAdPAAAAAAAAAEgAAAABAAAASAAAAAH/2P/gABBKRklGAAECAABIAEgAAP/tAAxBZG9iZV9DTQAB/+4ADkFkb2JlAGSAAAAAAf/bAIQADAgICAkIDAkJDBELCgsRFQ8MDA8VGBMTFRMTGBEMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAENCwsNDg0QDg4QFA4ODhQUDg4ODhQRDAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM/8AAEQgAHgB4AwEiAAIRAQMRAf/dAAQACP/EAT8AAAEFAQEBAQEBAAAAAAAAAAMAAQIEBQYHCAkKCwEAAQUBAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAABBAEDAgQCBQcGCAUDDDMBAAIRAwQhEjEFQVFhEyJxgTIGFJGhsUIjJBVSwWIzNHKC0UMHJZJT8OHxY3M1FqKygyZEk1RkRcKjdDYX0lXiZfKzhMPTdePzRieUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm9jdHV2d3h5ent8fX5/cRAAICAQIEBAMEBQYHBwYFNQEAAhEDITESBEFRYXEiEwUygZEUobFCI8FS0fAzJGLhcoKSQ1MVY3M08SUGFqKygwcmNcLSRJNUoxdkRVU2dGXi8rOEw9N14/NGlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vYnN0dXZ3eHl6e3x//aAAwDAQACEQMRAD8A9RyDeMe044abwx3pB/0S+P0e+PzNy4f6nf4xM3q/Xbuh9Zx6sPKYHCoVhwmys/paneo9/wCb9Bd4vJP8afRsjovW8X62dMBrL7G+s5v5t7NWPP8AxzB7klPoX1u6+Pq90HI6mGtfbXDaWOmHPcdrWu2lrlweb/jb63iYOBYcLGOVmMdc+uHw2vcWUEfpd26zY56rfXn6yM+tmP8AV/puC4fr5F2SxpnY+fR2P/4r9M9A+p9HT+sfXfKzMl9bOndPqNNDbHNa0tDfslDW7/5G+xJT02P/AIycvI+pGT9YGUU/bsS5tNtHu9MbnN2O+n6n0Hfvqz/i/wD8YNn1ouycTNqrx8qkCyptW4BzPov/AJxz/cxy8ty8g9D/AG99XS8WUZD2ipzTubNVnqVPa4fvVOWz1LHt+p/V+hfWXBZtxMyip9rRxu2tbl1f9cYfUSU9Z1r6/fWfH+t931d6Rg42W5seiH7w8+z1X7n+syv/AKKtU9d/xoOtY23oOK2suAe4P1A7n+kLkuodQzB/jS+39Fx29QusY2zHqLtoe19PO/8AksXZ1fWL/GG61jbPq5WxhcA53rgwO55SUkxPrn1fPzb8Pp/S25FmOXbv0wZ7Wu9Pd+laxqsYn1xub1ZnSer4DsDItLW1uDxY0l/83wB7Xu9u9j7FzX1YzsvC691CzFwn573b2urrcGlo9QHf7g5alnSeu9f+smN1LMwz0/FxfT0e4FxbW43bdPc59j3fuLQyYcUZSEoxjDgsS4v1nH/d4v8AuGUxF7ACu7rdE+tVnVOt5fS3Y4qbiiwi0OJLvTsZT9Ha36W9L6wfWqzo/U8XBbji4ZIaS8uLY3PNf0drly3QbuqU/WvqTumY7Mq8+uHMsfsAZ6zJfuP8rYm+s9/VbuvdPd1TGZi2jYGMrfvBb6h90j+Ul92x+8BQ4OC+Hi9XFw/u/MrgHF4U9H1L6352P19/RMPAblXAtFZNuwuLq23n6bdjdu799Qyfrl1HpeRVX1vpTsWq76NldrbNB9L6A2O2/ueosXquRdjf4xH30UOyrWOrLaGGC79XYNCVc6/j/WP6zvxsZvTHYNNLi59lz2kS727vzfaxv7jXpDDiHtcUYiEsYlOZlwz4q6er/uEcI0sCiNTb3DHtsY17DuY8BzSO4OoKShi0NxsarHaZbSxtYJ7hoDf4JKhpfhf4Mb//0PVVn9f6Pj9b6Rk9MyB7MhhDXfuvGtdg/qPWgkkp8A6B0Dq+HldYezFsuzel1ux666mlzhdcTQ2wAfuVepauy+p3+KzpOR0OrJ6/jWtz7nOcay91ZYydtbXMH535y9Aw/wBlfbs77Hs+2bmfbtn0t239F6n/AFpXUlPjH+MD/Fw7pt+Nd9XcO+/GtaW3MZutc17T9L85217V2/Vfqy/rf1Ao6a+sszacauyhrhDm2sb9A/u7/wCbXYJJKfBfqp0/6y9D+sGN1PI6Nm5DcYOBrbW4GC11bdrnN2+3cvSa/r71R9jGH6sdRaHOALi3QT+d9Fdikkp476odE6pgdcz8nLxzVTc14reS0zNgePoud+auxSSUuec5zuceGVDSq/6SZEk66PHfVfonVML60dQzcrHNeNc24V2EtIO62uxn0XF3uY1L639E6pn9cwMnExzbTS1gseC0RFhefpOb+auxSUvvZvdEuD18PDw1L5a+al3FLiutaeOt6J1R31+HVBjk4W5p9aWxpQ2r6O7f/Oe36K7FJJRZZzlwcUeHhgIx0rigNpLSSavspJJJRIf/2f/tDVZQaG90b3Nob3AgMy4wADhCSU0EJQAAAAAAEAAAAAAAAAAAAAAAAAAAAAA4QklNA+0AAAAAABAASAAAAAEAAgBIAAAAAQACOEJJTQQmAAAAAAAOAAAAAAAAAAAAAD+AAAA4QklNBA0AAAAAAAQAAAB4OEJJTQQZAAAAAAAEAAAAHjhCSU0D8wAAAAAACQAAAAAAAAAAAQA4QklNBAoAAAAAAAEAADhCSU0nEAAAAAAACgABAAAAAAAAAAI4QklNA/UAAAAAAEgAL2ZmAAEAbGZmAAYAAAAAAAEAL2ZmAAEAoZmaAAYAAAAAAAEAMgAAAAEAWgAAAAYAAAAAAAEANQAAAAEALQAAAAYAAAAAAAE4QklNA/gAAAAAAHAAAP////////////////////////////8D6AAAAAD/////////////////////////////A+gAAAAA/////////////////////////////wPoAAAAAP////////////////////////////8D6AAAOEJJTQQAAAAAAAACAAA4QklNBAIAAAAAAAIAADhCSU0EMAAAAAAAAQEAOEJJTQQtAAAAAAAGAAEAAAACOEJJTQQIAAAAAAAQAAAAAQAAAkAAAAJAAAAAADhCSU0EHgAAAAAA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cwMnExzbTS1gseC0RFhefpOb+auxSUvvZvdEuD18PDw1L5a+al3FLiutaeOt6J1R31+HVBjk4W5p9aWxpQ2r6O7f/Oe36K7FJJRZZzlwcUeHhgIx0rigNpLSSavspJJJRIf/2QA4QklNBCEAAAAAAFUAAAABAQAAAA8AQQBkAG8AYgBlACAAUABoAG8AdABvAHMAaABvAHAAAAATAEEAZABvAGIAZQAgAFAAaABvAHQAbwBzAGgAbwBwACAAQwBTADMAAAABADhCSU0EBgAAAAAABwAIAAAAAQEA/+EPzWh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8APD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNC4xLWMwMzYgNDYuMjc2NzIwLCBNb24gRmViIDE5IDIwMDcgMjI6NDA6MDggICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6eGFwPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4YXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIiBkYzpmb3JtYXQ9ImltYWdlL2pwZWciIHhhcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTMyBXaW5kb3dzIiB4YXA6Q3JlYXRlRGF0ZT0iMjAxMC0wNy0yMlQyMzo1NTozNiswODowMCIgeGFwOk1vZGlmeURhdGU9IjIwMTAtMDctMjJUMjM6NTU6MzYrMDg6MDAiIHhhcDpNZXRhZGF0YURhdGU9IjIwMTAtMDctMjJUMjM6NTU6MzYrMDg6MDAiIHhhcE1NOkRvY3VtZW50SUQ9InV1aWQ6MDUyQUQ3NzlBOTk1REYxMThCQUNDMzhCMDdFNjZBN0UiIHhhcE1NOkluc3RhbmNlSUQ9InV1aWQ6MDYyQUQ3NzlBOTk1REYxMThCQUNDMzhCMDdFNjZBN0UiIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHBob3Rvc2hvcDpJQ0NQcm9maWxlPSJzUkdCIElFQzYxOTY2LTIuMSIgcGhvdG9zaG9wOkhpc3Rvcnk9IiIgdGlmZjpPcmllbnRhdGlvbj0iMSIgdGlmZjpYUmVzb2x1dGlvbj0iNzIwMDAwLzEwMDAwIiB0aWZmOllSZXNvbHV0aW9uPSI3MjAwMDAvMTAwMDAiIHRpZmY6UmVzb2x1dGlvblVuaXQ9IjIiIHRpZmY6TmF0aXZlRGlnZXN0PSIyNTYsMjU3LDI1OCwyNTksMjYyLDI3NCwyNzcsMjg0LDUzMCw1MzEsMjgyLDI4MywyOTYsMzAxLDMxOCwzMTksNTI5LDUzMiwzMDYsMjcwLDI3MSwyNzIsMzA1LDMxNSwzMzQzMjtCRjY5NDIzMzhGRTkyQ0VFMkVGRkUyRDQwNjNFNDlBMiIgZXhpZjpQaXhlbFhEaW1lbnNpb249IjEyMCIgZXhpZjpQaXhlbFlEaW1lbnNpb249IjMwIiBleGlmOkNvbG9yU3BhY2U9IjEiIGV4aWY6TmF0aXZlRGlnZXN0PSIzNjg2NCw0MDk2MCw0MDk2MSwzNzEyMSwzNzEyMiw0MDk2Miw0MDk2MywzNzUxMCw0MDk2NCwzNjg2NywzNjg2OCwzMzQzNCwzMzQzNywzNDg1MCwzNDg1MiwzNDg1NSwzNDg1NiwzNzM3NywzNzM3OCwzNzM3OSwzNzM4MCwzNzM4MSwzNzM4MiwzNzM4MywzNzM4NCwzNzM4NSwzNzM4NiwzNzM5Niw0MTQ4Myw0MTQ4NCw0MTQ4Niw0MTQ4Nyw0MTQ4OCw0MTQ5Miw0MTQ5Myw0MTQ5NSw0MTcyOCw0MTcyOSw0MTczMCw0MTk4NSw0MTk4Niw0MTk4Nyw0MTk4OCw0MTk4OSw0MTk5MCw0MTk5MSw0MTk5Miw0MTk5Myw0MTk5NCw0MTk5NSw0MTk5Niw0MjAxNiwwLDIsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMjAsMjIsMjMsMjQsMjUsMjYsMjcsMjgsMzA7MUJGQUY3NzBEMDkyQ0UzOTNEQjEzMDgyQ0NDNjkwMzUiPiA8eGFwTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0idXVpZDo0ODZDRkU1N0E5OTVERjExOEJBQ0MzOEIwN0U2NkE3RSIgc3RSZWY6ZG9jdW1lbnRJRD0idXVpZDo0ODZDRkU1N0E5OTVERjExOEJBQ0MzOEIwN0U2NkE3RSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3hwYWNrZXQgZW5kPSJ3Ij8+/+IMWElDQ19QUk9GSUxFAAEBAAAMSExpbm8CEAAAbW50clJHQiBYWVogB84AAgAJAAYAMQAAYWNzcE1TRlQAAAAASUVDIHNSR0IAAAAAAAAAAAAAAAEAAPbWAAEAAAAA0y1IUCAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARY3BydAAAAVAAAAAzZGVzYwAAAYQAAABsd3RwdAAAAfAAAAAUYmtwdAAAAgQAAAAUclhZWgAAAhgAAAAUZ1hZWgAAAiwAAAAUYlhZWgAAAkAAAAAU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' );
define ( 'MAGIC_QUOTES_GPC', get_magic_quotes_gpc ( ) );
set_magic_quotes_runtime ( 0 );

/**
 * 框架核心类，抽象类，所有方法均为静态方法
 * @author aray
 * @abstract
 */
abstract class vane {
	/**
	 * 文件搜索路径
	 * @var array
	 */
	private static $searchPath = array (
		VANEDIR 
	);
	/**
	 * 单件变量存放容器
	 * @var array
	 */
	private static $OBJECT = array ();
	
	/**
	 * 导入应用路径
	 * @param string $dir   应用路径
	 * @static
	 * @final
	 */
	final public static function import ( $dirs ) {
		if ( ! is_array ( $dirs ) ) {
			$dirs = array (
				$dirs 
			);
		}
		foreach ( $dirs as $dir ) {
			if ( file_exists ( $dir ) ) {
				if ( ! in_array ( $dir, self::$searchPath ) ) {
					self::$searchPath[] = $dir;
				}
			} else {
				trigger_error ( "无法导入应用路径 {$dir}", E_USER_ERROR );
			}
		}
	}
	
	/**
	 * 载入文件路径
	 * @param string $path  路径
	 * @param bool $once    是否以require_once方式加载
	 * @return mixed
	 * @static
	 * @final
	 */
	final public static function load ( $path, $message = '', $once = true ) {
		if ( file_exists ( $path ) && is_file ( $path ) ) {
			if ( $once ) {
				return require_once ($path);
			}
			return require ($path);
		} else {
			foreach ( self::$searchPath as $dir ) {
				$loadPath = $dir . DS . $path;
				$loadPath = str_replace ( '_', DS, $loadPath );
				$loadPath = strpos ( $loadPath, '.php' ) ? $loadPath : $loadPath . '.php';
				if ( file_exists ( $loadPath ) ) {
					if ( $once ) {
						return require_once ($loadPath);
					}
					return require ($loadPath);
				}
			}
		}
		$path = $loadPath;
		$message = ($message == '' ? '无法加载路径%s' : (strpos ( $message, '%s' ) === false ? $message . '%s' : $message));
		trigger_error ( sprintf ( $message, $path ), E_USER_ERROR );
	}
	
	/**
	 * 获取对象的惟一实例[getSingleton别名]
	 * @param string $class 类定义路径
	 * @param array $args  实例化参数
	 * @return object
	 * @static
	 * @final
	 */
	final public static function singleton ( $class, $args = array() ) {
		return self::getSingleton ( $class, $args );
	}
	
	/**
	 * 
	 * 获取对象的惟一实例
	 * @param string $class 类定义路径
	 * @param array $args  实例化参数
	 * @return object
	 * @static
	 * @final
	 */
	final public static function getSingleton ( $class, $args = array() ) {
		$className = $class;
		if ( strrpos ( $class, '/' ) != false ) {
			$className = substr ( $class, strrpos ( $class, '/' ) + 1 );
		}
		if ( ! class_exists ( $className ) && ! interface_exists ( $className ) ) {
			self::load ( $class, "无法加载类{$class}路径" );
		}
		$hash = $className . '@' . md5 ( serialize ( $args ) );
		if ( ! isset ( self::$OBJECT[$hash] ) || is_null ( self::$OBJECT[$hash] ) ) {
			self::$OBJECT[$hash] = new $className ( $args );
		}
		
		return self::$OBJECT[$hash];
	}
	
	/**
	 * 初始化应用框架
	 * <code>
	 * // 如果不以MVC方式运行，可以直接使用该方法初始化框架即可。
	 * vane::init('debug'); //以debug模式选择
	 * vane::init();        //以部署模式运行
	 * </code>
	 * @param string $runMode  执行模式 [部署模式	 | 调试模式]
	 * @static
	 * @final
	 */
	final public static function init ( $runMode = '' ) {
		static $inited = false;
		if ( $inited === false ) {
			# 调试模式运行
			$errLevel = config::get ( 'error_level' );
			$errorLevel = array ();
			if ( $runMode == 'debug' ) {
				config::set ( 'error_detail', true );
				define ( 'RUN_MODE', 'DEBUG' );
				$errorLevel = $errLevel;
			} else {
				config::set ( 'error_detail', false );
				define ( 'RUN_MODE', 'DEPLOY' );
				foreach ( $errLevel as & $err ) {
					if ( $err == E_NOTICE || $err == E_USER_NOTICE ) {
					} else {
						$errorLevel[] = $err;
					}
				}
			}
			config::set ( 'error_level', $errorLevel );
			
			# 初始化错误处理句柄 
			$errorhandler = config::get ( 'error_handler' );
			if ( $errorhandler == null ) {
				$errorhandler = 'vaneErrorHandler';
			}
			set_error_handler ( $errorhandler );
			
			# 自动加载路径
			foreach ( config::get ( 'autoloads' ) as $file ) {
				vane::load ( $file );
			}
			
			# 初始化会话session
			/*COOKIE域*/
			ini_set ( 'session.cookie_domain', config::get ( 'cookie_domain' ) );
			session_cache_expire ( config::get ( 'cookie_expires' ) );
			
			$sessionName = config::get ( 'session_idname' );
			$sessionId = isset ( $_GET[$sessionName] ) ? $_GET[$sessionName] : null;
			if ( $sessionId ) {
				session_name ( $sessionName );
				session_id ( $sessionId );
			} else {
				session_name ( $sessionName );
			}
			session_start ( );
			
			# 加载视图工具类
			vane::load ( 'view' );
			
			header ( "X-Powered-By: VANEPHP 1.8\n" );
			header ( "content-type:text/html;charset=utf-8\n" );
			
			$inited = true;
		}
	}
	
	/**
	 * 以MVC模式运行
	 * @param string $runMode  执行模式
	 * @static
	 * @final
	 */
	final public static function run ( $runMode = '' ) {
		self::init ( $runMode );
		
		# 开始调度
		vane::load ( 'dispatcher' );
		dispatcher::dispatching ( );
	}
	
	/**
	 * 调试输出变量的值
	 * @param mixed $var   变量
	 * @param bool $exit  是否输出后停止
	 */
	final public static function dump ( $var, $exit = true, $color = false ) {
		if ( is_array ( $var ) || is_object ( $var ) ) {
			if ( $color ) {
				highlight_string ( '<?php return ' . var_export ( $var, true ) . ';' );
			} else {
				print_r ( $var );
			}
		} else {
			if ( $color ) {
				highlight_string ( '<?php return \'' . $var . '\';' );
			} else {
				echo $var;
			}
		}
		if ( $exit )
			exit ( );
	}
}

/**
 * 错误处理句柄
 * @param $errno
 * @param $errstr
 * @param $errfile
 * @param $errline
 */
function vaneErrorHandler ( $errno, $errstr, $errfile, $errline ) {
	$errorLevel = config::get ( 'error_level' );
	if ( $errorLevel && in_array ( $errno, $errorLevel ) ) {
		if ( ob_get_length ( ) > 0 ) {
			ob_clean ( );
		}
		include VANEDIR . '/error.php';
		exit ( );
	}
	return true;
}

/**
 * 系统默认配置
 */
# 导入框架路径
vane::load ( 'config' );
vane::load ( 'context' );
vane::load ( 'dbo' );
vane::load ( 'cache' );
vane::load ( 'date' );
vane::load ( 'log' );

# 载入默认配置
config::load ( 'vane_config_default' );

/**
 * 调度失败的处理句柄
 * @param $controller	控制器
 * @param $action		动作
 */
function dispatchFailureCallback ( $controller, $action ) {
	trigger_error ( '访问被拦截，请检查是否拥有角色权限', E_USER_ERROR );
	exit ( );
}

# 加载firephp
require_once (VANEDIR . DS . '3rd' . DS . 'firephp' . DS . 'fb.php');

# 生成框架LOGO
if ( isset ( $_GET['vanelogo'] ) ) {
	header ( "content-type: image/jpeg\n" );
	echo base64_decode ( APP_LOGO );
	exit ( );
}